package jupitermouse.site.juc.demo.aqs.semaphore;

import java.util.concurrent.Semaphore;

/**
 * <p>
 * Semaphore 限流，作用是控制线程的并发数量
 * </p>
 *
 * @author jupiter
 */
public class SemaphoreApp {
    public static void main(String[] args) {
        // 限流（AQS）

        // permits； 令牌（5）；

        Semaphore semaphore = new Semaphore(3);
        new Car(1, semaphore).start();
        new Car(2, semaphore).start();
        new Car(3, semaphore).start();
        new Car(4, semaphore).start();
        new Car(5, semaphore).start();
        //公平和非公平
    }


    static class Car extends Thread {
        private int num;
        private Semaphore semaphore;

        public Car(int num, Semaphore semaphore) {
            this.num = num;
            this.semaphore = semaphore;
        }

        @Override
        public void run() {
            try {
                // 在 semaphore.acquire() 和 semaphore.release()之间的代码，同一时刻只允许制定个数的线程进入，
                // 因为semaphore的构造方法是1，则同一时刻只允许一个线程进入，其他线程只能等待。
                semaphore.acquire();
                System.out.println("第" + num + "抢占一个车位");
                Thread.sleep(2000);
                System.out.println("第" + num + "开走");
                semaphore.release();
            } catch (Exception e) {
                e.printStackTrace();
            }

        }
    }
}
